{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6b5297bf",
   "metadata": {},
   "source": [
    "### 数据来源\n",
    "\n",
    "\n",
    "解释下，数据最初是我从网上下载的，来源网站找不到了。\n",
    "\n",
    "不过搜了下，kaggle有这个地址，如果需要来源的话，看这个URL：\n",
    "\n",
    "https://www.kaggle.com/code/cagkanbay/car-price-prediction/data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1f5c857f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d11fe88",
   "metadata": {},
   "source": [
    "### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d46fc972",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(\"./car_price.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "863f86fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>year</th>\n",
       "      <th>selling_price</th>\n",
       "      <th>km_driven</th>\n",
       "      <th>fuel</th>\n",
       "      <th>seller_type</th>\n",
       "      <th>transmission</th>\n",
       "      <th>owner</th>\n",
       "      <th>mileage</th>\n",
       "      <th>engine</th>\n",
       "      <th>max_power</th>\n",
       "      <th>torque</th>\n",
       "      <th>seats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Maruti Swift Dzire VDI</td>\n",
       "      <td>2014</td>\n",
       "      <td>450000</td>\n",
       "      <td>145500</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.4 kmpl</td>\n",
       "      <td>1248 CC</td>\n",
       "      <td>74 bhp</td>\n",
       "      <td>190Nm@ 2000rpm</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Skoda Rapid 1.5 TDI Ambition</td>\n",
       "      <td>2014</td>\n",
       "      <td>370000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Second Owner</td>\n",
       "      <td>21.14 kmpl</td>\n",
       "      <td>1498 CC</td>\n",
       "      <td>103.52 bhp</td>\n",
       "      <td>250Nm@ 1500-2500rpm</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Honda City 2017-2020 EXi</td>\n",
       "      <td>2006</td>\n",
       "      <td>158000</td>\n",
       "      <td>140000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Third Owner</td>\n",
       "      <td>17.7 kmpl</td>\n",
       "      <td>1497 CC</td>\n",
       "      <td>78 bhp</td>\n",
       "      <td>12.7@ 2,700(kgm@ rpm)</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           name  year  selling_price  km_driven    fuel   \n",
       "0        Maruti Swift Dzire VDI  2014         450000     145500  Diesel  \\\n",
       "1  Skoda Rapid 1.5 TDI Ambition  2014         370000     120000  Diesel   \n",
       "2      Honda City 2017-2020 EXi  2006         158000     140000  Petrol   \n",
       "\n",
       "  seller_type transmission         owner     mileage   engine   max_power   \n",
       "0  Individual       Manual   First Owner   23.4 kmpl  1248 CC      74 bhp  \\\n",
       "1  Individual       Manual  Second Owner  21.14 kmpl  1498 CC  103.52 bhp   \n",
       "2  Individual       Manual   Third Owner   17.7 kmpl  1497 CC      78 bhp   \n",
       "\n",
       "                  torque  seats  \n",
       "0         190Nm@ 2000rpm    5.0  \n",
       "1    250Nm@ 1500-2500rpm    5.0  \n",
       "2  12.7@ 2,700(kgm@ rpm)    5.0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7438226d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 8128 entries, 0 to 8127\n",
      "Data columns (total 13 columns):\n",
      " #   Column         Non-Null Count  Dtype  \n",
      "---  ------         --------------  -----  \n",
      " 0   name           8128 non-null   object \n",
      " 1   year           8128 non-null   int64  \n",
      " 2   selling_price  8128 non-null   int64  \n",
      " 3   km_driven      8128 non-null   int64  \n",
      " 4   fuel           8128 non-null   object \n",
      " 5   seller_type    8128 non-null   object \n",
      " 6   transmission   8128 non-null   object \n",
      " 7   owner          8128 non-null   object \n",
      " 8   mileage        7907 non-null   object \n",
      " 9   engine         7907 non-null   object \n",
      " 10  max_power      7913 non-null   object \n",
      " 11  torque         7906 non-null   object \n",
      " 12  seats          7907 non-null   float64\n",
      "dtypes: float64(1), int64(3), object(9)\n",
      "memory usage: 825.6+ KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a326717f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "name               0\n",
       "year               0\n",
       "selling_price      0\n",
       "km_driven          0\n",
       "fuel               0\n",
       "seller_type        0\n",
       "transmission       0\n",
       "owner              0\n",
       "mileage          221\n",
       "engine           221\n",
       "max_power        215\n",
       "torque           222\n",
       "seats            221\n",
       "dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "edf04483",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.dropna(inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "709b5844",
   "metadata": {},
   "source": [
    "### 数据的清晰处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "60c2d02d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>year</th>\n",
       "      <th>selling_price</th>\n",
       "      <th>km_driven</th>\n",
       "      <th>fuel</th>\n",
       "      <th>seller_type</th>\n",
       "      <th>transmission</th>\n",
       "      <th>owner</th>\n",
       "      <th>mileage</th>\n",
       "      <th>engine</th>\n",
       "      <th>max_power</th>\n",
       "      <th>torque</th>\n",
       "      <th>seats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Maruti Swift Dzire VDI</td>\n",
       "      <td>2014</td>\n",
       "      <td>450000</td>\n",
       "      <td>145500</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.4 kmpl</td>\n",
       "      <td>1248 CC</td>\n",
       "      <td>74 bhp</td>\n",
       "      <td>190Nm@ 2000rpm</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Skoda Rapid 1.5 TDI Ambition</td>\n",
       "      <td>2014</td>\n",
       "      <td>370000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Second Owner</td>\n",
       "      <td>21.14 kmpl</td>\n",
       "      <td>1498 CC</td>\n",
       "      <td>103.52 bhp</td>\n",
       "      <td>250Nm@ 1500-2500rpm</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Honda City 2017-2020 EXi</td>\n",
       "      <td>2006</td>\n",
       "      <td>158000</td>\n",
       "      <td>140000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Third Owner</td>\n",
       "      <td>17.7 kmpl</td>\n",
       "      <td>1497 CC</td>\n",
       "      <td>78 bhp</td>\n",
       "      <td>12.7@ 2,700(kgm@ rpm)</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           name  year  selling_price  km_driven    fuel   \n",
       "0        Maruti Swift Dzire VDI  2014         450000     145500  Diesel  \\\n",
       "1  Skoda Rapid 1.5 TDI Ambition  2014         370000     120000  Diesel   \n",
       "2      Honda City 2017-2020 EXi  2006         158000     140000  Petrol   \n",
       "\n",
       "  seller_type transmission         owner     mileage   engine   max_power   \n",
       "0  Individual       Manual   First Owner   23.4 kmpl  1248 CC      74 bhp  \\\n",
       "1  Individual       Manual  Second Owner  21.14 kmpl  1498 CC  103.52 bhp   \n",
       "2  Individual       Manual   Third Owner   17.7 kmpl  1497 CC      78 bhp   \n",
       "\n",
       "                  torque  seats  \n",
       "0         190Nm@ 2000rpm    5.0  \n",
       "1    250Nm@ 1500-2500rpm    5.0  \n",
       "2  12.7@ 2,700(kgm@ rpm)    5.0  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "263927ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    23.40\n",
       "1    21.14\n",
       "2    17.70\n",
       "Name: mileage, dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"mileage\"] = df[\"mileage\"].map(lambda x : float(x.split(\" \")[0]))\n",
    "df[\"mileage\"].head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "95a32e94",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    1248.0\n",
       "1    1498.0\n",
       "2    1497.0\n",
       "Name: engine, dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"engine\"] = df[\"engine\"].map(lambda x : float(x.split(\" \")[0]))\n",
    "df[\"engine\"].head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "35f08e5f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     74.00\n",
       "1    103.52\n",
       "2     78.00\n",
       "Name: max_power, dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"max_power\"] = df[\"max_power\"].map(lambda x : float(x.split(\" \")[0]))\n",
    "df[\"max_power\"].head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "084ae8e6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    2000.0\n",
       "1    2500.0\n",
       "2    2700.0\n",
       "Name: torque, dtype: float64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 12.7@ 2,700(kgm@ rpm)\t\n",
    "\n",
    "import re\n",
    "\n",
    "def parse_rpm(torque):\n",
    "    torque = torque.replace(\",\", \"\")\n",
    "    return max([float(x) for x in re.findall(\"\\d+\", torque)])\n",
    "\n",
    "df[\"torque\"] = df[\"torque\"].map(parse_rpm)\n",
    "df[\"torque\"].head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "77522c5d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Index: 7906 entries, 0 to 8127\n",
      "Data columns (total 13 columns):\n",
      " #   Column         Non-Null Count  Dtype  \n",
      "---  ------         --------------  -----  \n",
      " 0   name           7906 non-null   object \n",
      " 1   year           7906 non-null   int64  \n",
      " 2   selling_price  7906 non-null   int64  \n",
      " 3   km_driven      7906 non-null   int64  \n",
      " 4   fuel           7906 non-null   object \n",
      " 5   seller_type    7906 non-null   object \n",
      " 6   transmission   7906 non-null   object \n",
      " 7   owner          7906 non-null   object \n",
      " 8   mileage        7906 non-null   float64\n",
      " 9   engine         7906 non-null   float64\n",
      " 10  max_power      7906 non-null   float64\n",
      " 11  torque         7906 non-null   float64\n",
      " 12  seats          7906 non-null   float64\n",
      "dtypes: float64(5), int64(3), object(5)\n",
      "memory usage: 864.7+ KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9167e4a0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>year</th>\n",
       "      <th>selling_price</th>\n",
       "      <th>km_driven</th>\n",
       "      <th>fuel</th>\n",
       "      <th>seller_type</th>\n",
       "      <th>transmission</th>\n",
       "      <th>owner</th>\n",
       "      <th>mileage</th>\n",
       "      <th>engine</th>\n",
       "      <th>max_power</th>\n",
       "      <th>torque</th>\n",
       "      <th>seats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Maruti Swift Dzire VDI</td>\n",
       "      <td>2014</td>\n",
       "      <td>450000</td>\n",
       "      <td>145500</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.40</td>\n",
       "      <td>1248.0</td>\n",
       "      <td>74.00</td>\n",
       "      <td>2000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Skoda Rapid 1.5 TDI Ambition</td>\n",
       "      <td>2014</td>\n",
       "      <td>370000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Second Owner</td>\n",
       "      <td>21.14</td>\n",
       "      <td>1498.0</td>\n",
       "      <td>103.52</td>\n",
       "      <td>2500.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Honda City 2017-2020 EXi</td>\n",
       "      <td>2006</td>\n",
       "      <td>158000</td>\n",
       "      <td>140000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Third Owner</td>\n",
       "      <td>17.70</td>\n",
       "      <td>1497.0</td>\n",
       "      <td>78.00</td>\n",
       "      <td>2700.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           name  year  selling_price  km_driven    fuel   \n",
       "0        Maruti Swift Dzire VDI  2014         450000     145500  Diesel  \\\n",
       "1  Skoda Rapid 1.5 TDI Ambition  2014         370000     120000  Diesel   \n",
       "2      Honda City 2017-2020 EXi  2006         158000     140000  Petrol   \n",
       "\n",
       "  seller_type transmission         owner  mileage  engine  max_power  torque   \n",
       "0  Individual       Manual   First Owner    23.40  1248.0      74.00  2000.0  \\\n",
       "1  Individual       Manual  Second Owner    21.14  1498.0     103.52  2500.0   \n",
       "2  Individual       Manual   Third Owner    17.70  1497.0      78.00  2700.0   \n",
       "\n",
       "   seats  \n",
       "0    5.0  \n",
       "1    5.0  \n",
       "2    5.0  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bbf58289",
   "metadata": {},
   "source": [
    "### 数据的统计分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "66f99e97",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>selling_price</th>\n",
       "      <th>km_driven</th>\n",
       "      <th>fuel</th>\n",
       "      <th>seller_type</th>\n",
       "      <th>transmission</th>\n",
       "      <th>owner</th>\n",
       "      <th>mileage</th>\n",
       "      <th>engine</th>\n",
       "      <th>max_power</th>\n",
       "      <th>torque</th>\n",
       "      <th>seats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2014</td>\n",
       "      <td>450000</td>\n",
       "      <td>145500</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.40</td>\n",
       "      <td>1248.0</td>\n",
       "      <td>74.00</td>\n",
       "      <td>2000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2014</td>\n",
       "      <td>370000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Second Owner</td>\n",
       "      <td>21.14</td>\n",
       "      <td>1498.0</td>\n",
       "      <td>103.52</td>\n",
       "      <td>2500.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2006</td>\n",
       "      <td>158000</td>\n",
       "      <td>140000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Third Owner</td>\n",
       "      <td>17.70</td>\n",
       "      <td>1497.0</td>\n",
       "      <td>78.00</td>\n",
       "      <td>2700.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   year  selling_price  km_driven    fuel seller_type transmission   \n",
       "0  2014         450000     145500  Diesel  Individual       Manual  \\\n",
       "1  2014         370000     120000  Diesel  Individual       Manual   \n",
       "2  2006         158000     140000  Petrol  Individual       Manual   \n",
       "\n",
       "          owner  mileage  engine  max_power  torque  seats  \n",
       "0   First Owner    23.40  1248.0      74.00  2000.0    5.0  \n",
       "1  Second Owner    21.14  1498.0     103.52  2500.0    5.0  \n",
       "2   Third Owner    17.70  1497.0      78.00  2700.0    5.0  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.drop(columns=[\"name\"], inplace=True)\n",
    "df.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "044ec025",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fuel</th>\n",
       "      <th>seller_type</th>\n",
       "      <th>transmission</th>\n",
       "      <th>owner</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>7906</td>\n",
       "      <td>7906</td>\n",
       "      <td>7906</td>\n",
       "      <td>7906</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>unique</th>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>top</th>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>freq</th>\n",
       "      <td>4299</td>\n",
       "      <td>6563</td>\n",
       "      <td>6865</td>\n",
       "      <td>5215</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          fuel seller_type transmission        owner\n",
       "count     7906        7906         7906         7906\n",
       "unique       4           3            2            5\n",
       "top     Diesel  Individual       Manual  First Owner\n",
       "freq      4299        6563         6865         5215"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.select_dtypes(include=[\"object\"]).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "12a5dbf8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mileage</th>\n",
       "      <th>engine</th>\n",
       "      <th>max_power</th>\n",
       "      <th>torque</th>\n",
       "      <th>seats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>7906.000000</td>\n",
       "      <td>7906.000000</td>\n",
       "      <td>7906.000000</td>\n",
       "      <td>7906.000000</td>\n",
       "      <td>7906.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>19.419861</td>\n",
       "      <td>1458.708829</td>\n",
       "      <td>91.587374</td>\n",
       "      <td>3069.864154</td>\n",
       "      <td>5.416393</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>4.036263</td>\n",
       "      <td>503.893057</td>\n",
       "      <td>35.747216</td>\n",
       "      <td>943.662100</td>\n",
       "      <td>0.959208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>624.000000</td>\n",
       "      <td>32.800000</td>\n",
       "      <td>400.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>16.780000</td>\n",
       "      <td>1197.000000</td>\n",
       "      <td>68.050000</td>\n",
       "      <td>2400.000000</td>\n",
       "      <td>5.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>19.300000</td>\n",
       "      <td>1248.000000</td>\n",
       "      <td>82.000000</td>\n",
       "      <td>3000.000000</td>\n",
       "      <td>5.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>22.320000</td>\n",
       "      <td>1582.000000</td>\n",
       "      <td>102.000000</td>\n",
       "      <td>4000.000000</td>\n",
       "      <td>5.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>42.000000</td>\n",
       "      <td>3604.000000</td>\n",
       "      <td>400.000000</td>\n",
       "      <td>21800.000000</td>\n",
       "      <td>14.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           mileage       engine    max_power        torque        seats\n",
       "count  7906.000000  7906.000000  7906.000000   7906.000000  7906.000000\n",
       "mean     19.419861  1458.708829    91.587374   3069.864154     5.416393\n",
       "std       4.036263   503.893057    35.747216    943.662100     0.959208\n",
       "min       0.000000   624.000000    32.800000    400.000000     2.000000\n",
       "25%      16.780000  1197.000000    68.050000   2400.000000     5.000000\n",
       "50%      19.300000  1248.000000    82.000000   3000.000000     5.000000\n",
       "75%      22.320000  1582.000000   102.000000   4000.000000     5.000000\n",
       "max      42.000000  3604.000000   400.000000  21800.000000    14.000000"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.select_dtypes(include=[\"float\"]).describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "84521168",
   "metadata": {},
   "outputs": [],
   "source": [
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "50559e85",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple\n",
      "Requirement already satisfied: seaborn in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (0.12.2)\n",
      "Requirement already satisfied: matplotlib!=3.6.1,>=3.1 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from seaborn) (3.7.1)\n",
      "Requirement already satisfied: numpy!=1.24.0,>=1.17 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from seaborn) (1.24.3)\n",
      "Requirement already satisfied: pandas>=0.25 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from seaborn) (2.0.0)\n",
      "Requirement already satisfied: pillow>=6.2.0 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (9.5.0)\n",
      "Requirement already satisfied: cycler>=0.10 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (0.11.0)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (1.0.7)\n",
      "Requirement already satisfied: packaging>=20.0 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (23.1)\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (3.0.9)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (2.8.2)\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (1.4.4)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from matplotlib!=3.6.1,>=3.1->seaborn) (4.39.3)\n",
      "Requirement already satisfied: tzdata>=2022.1 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from pandas>=0.25->seaborn) (2023.3)\n",
      "Requirement already satisfied: pytz>=2020.1 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from pandas>=0.25->seaborn) (2023.3)\n",
      "Requirement already satisfied: six>=1.5 in /Users/peishuaishuai/opt/anaconda3/envs/mysklearn/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.1->seaborn) (1.16.0)\n"
     ]
    }
   ],
   "source": [
    "!pip install seaborn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "95f771e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>selling_price</th>\n",
       "      <th>km_driven</th>\n",
       "      <th>fuel</th>\n",
       "      <th>seller_type</th>\n",
       "      <th>transmission</th>\n",
       "      <th>owner</th>\n",
       "      <th>mileage</th>\n",
       "      <th>engine</th>\n",
       "      <th>max_power</th>\n",
       "      <th>torque</th>\n",
       "      <th>seats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2014</td>\n",
       "      <td>450000</td>\n",
       "      <td>145500</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.40</td>\n",
       "      <td>1248.0</td>\n",
       "      <td>74.00</td>\n",
       "      <td>2000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2014</td>\n",
       "      <td>370000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Second Owner</td>\n",
       "      <td>21.14</td>\n",
       "      <td>1498.0</td>\n",
       "      <td>103.52</td>\n",
       "      <td>2500.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2006</td>\n",
       "      <td>158000</td>\n",
       "      <td>140000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Third Owner</td>\n",
       "      <td>17.70</td>\n",
       "      <td>1497.0</td>\n",
       "      <td>78.00</td>\n",
       "      <td>2700.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2010</td>\n",
       "      <td>225000</td>\n",
       "      <td>127000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.00</td>\n",
       "      <td>1396.0</td>\n",
       "      <td>90.00</td>\n",
       "      <td>2750.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2007</td>\n",
       "      <td>130000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>16.10</td>\n",
       "      <td>1298.0</td>\n",
       "      <td>88.20</td>\n",
       "      <td>4500.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8123</th>\n",
       "      <td>2013</td>\n",
       "      <td>320000</td>\n",
       "      <td>110000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>18.50</td>\n",
       "      <td>1197.0</td>\n",
       "      <td>82.85</td>\n",
       "      <td>4000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8124</th>\n",
       "      <td>2007</td>\n",
       "      <td>135000</td>\n",
       "      <td>119000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Fourth &amp; Above Owner</td>\n",
       "      <td>16.80</td>\n",
       "      <td>1493.0</td>\n",
       "      <td>110.00</td>\n",
       "      <td>2750.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8125</th>\n",
       "      <td>2009</td>\n",
       "      <td>382000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>19.30</td>\n",
       "      <td>1248.0</td>\n",
       "      <td>73.90</td>\n",
       "      <td>2000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8126</th>\n",
       "      <td>2013</td>\n",
       "      <td>290000</td>\n",
       "      <td>25000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.57</td>\n",
       "      <td>1396.0</td>\n",
       "      <td>70.00</td>\n",
       "      <td>3000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8127</th>\n",
       "      <td>2013</td>\n",
       "      <td>290000</td>\n",
       "      <td>25000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.57</td>\n",
       "      <td>1396.0</td>\n",
       "      <td>70.00</td>\n",
       "      <td>3000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>7906 rows × 12 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      year  selling_price  km_driven    fuel seller_type transmission   \n",
       "0     2014         450000     145500  Diesel  Individual       Manual  \\\n",
       "1     2014         370000     120000  Diesel  Individual       Manual   \n",
       "2     2006         158000     140000  Petrol  Individual       Manual   \n",
       "3     2010         225000     127000  Diesel  Individual       Manual   \n",
       "4     2007         130000     120000  Petrol  Individual       Manual   \n",
       "...    ...            ...        ...     ...         ...          ...   \n",
       "8123  2013         320000     110000  Petrol  Individual       Manual   \n",
       "8124  2007         135000     119000  Diesel  Individual       Manual   \n",
       "8125  2009         382000     120000  Diesel  Individual       Manual   \n",
       "8126  2013         290000      25000  Diesel  Individual       Manual   \n",
       "8127  2013         290000      25000  Diesel  Individual       Manual   \n",
       "\n",
       "                     owner  mileage  engine  max_power  torque  seats  \n",
       "0              First Owner    23.40  1248.0      74.00  2000.0    5.0  \n",
       "1             Second Owner    21.14  1498.0     103.52  2500.0    5.0  \n",
       "2              Third Owner    17.70  1497.0      78.00  2700.0    5.0  \n",
       "3              First Owner    23.00  1396.0      90.00  2750.0    5.0  \n",
       "4              First Owner    16.10  1298.0      88.20  4500.0    5.0  \n",
       "...                    ...      ...     ...        ...     ...    ...  \n",
       "8123           First Owner    18.50  1197.0      82.85  4000.0    5.0  \n",
       "8124  Fourth & Above Owner    16.80  1493.0     110.00  2750.0    5.0  \n",
       "8125           First Owner    19.30  1248.0      73.90  2000.0    5.0  \n",
       "8126           First Owner    23.57  1396.0      70.00  3000.0    5.0  \n",
       "8127           First Owner    23.57  1396.0      70.00  3000.0    5.0  \n",
       "\n",
       "[7906 rows x 12 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "5f7bc0e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoQAAAKZCAYAAAAh/zoKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACJH0lEQVR4nOzdd1gUVxcG8HdpSweRZkcltthFDHYj9hh7LCQqttijaCyxxyh+Ro01EnuJNZoYjQY7xhYRFEsUkCYWOiK97nx/YFY3gMIyy7rs+8szz5O5e2f2zCJwOHfuHYkgCAKIiIiISGvpqDsAIiIiIlIvJoREREREWo4JIREREZGWY0JIREREpOWYEBIRERFpOSaERERERFqOCSERERGRlmNCSERERKTlmBASERERaTkmhERERERajgkhERERkQr99ddf6N27NypXrgyJRIJjx4698xgfHx80b94cUqkUjo6O2LVrl0pjZEJIREREpEJpaWlo0qQJNm3aVKz+4eHh6NWrFzp16oSAgABMmzYNY8aMwenTp1UWo0QQBEFlZyciIiIiOYlEgt9++w19+/Ytss/s2bNx8uRJ3L9/X942ZMgQJCUlwdvbWyVxsUJIREREVEJZWVlITk5W2LKyskQ59/Xr1+Hq6qrQ1q1bN1y/fl2U8xdGT2VnLqGc+DB1h0CvGFVup+4Q6JVGVg7qDoFecTasrO4Q6A3eKUHqDoFeeZxwV23vrc7cwXPjHixZskShbdGiRVi8eHGpzx0dHQ07OzuFNjs7OyQnJyMjIwNGRkalfo//em8SQiIiIiJNMXfuXHh4eCi0SaVSNUVTekwIiYiIiEpIKpWqLAG0t7dHTEyMQltMTAzMzc1VUh0EmBASERGRppLlqTsClXBxccGpU6cU2s6ePQsXFxeVvScnlRARERGpUGpqKgICAhAQEAAgf1mZgIAAREZGAsgffh4+fLi8//jx4xEWFoZZs2YhMDAQP/74Iw4fPozp06erLEZWCImIiEgzCTJ1R1Asfn5+6NSpk3z/33sPR4wYgV27diEqKkqeHAJAzZo1cfLkSUyfPh3r1q1D1apVsW3bNnTr1k1lMb436xBylvH7g7OM3x+cZfz+4Czj9wtnGb8/1DrLOEZ9/w707eqq7b1VgRVCIiIi0kwyzagQagLeQ0hERESk5ZgQEhEREWk5DhkTERGRRhI0ZFKJJmCFkIiIiEjLsUJIREREmomTSkTDCiERERGRlmNCSERERKTlOGRMREREmomTSkTDCiERERGRlmOFkIiIiDSTLE/dEZQbrBASERERaTkmhERERERajkPGREREpJk4qUQ0rBASERERaTlWCImIiEgz8UklomGFkIiIiEjLsUJIREREGkngPYSiYYWQiIiISMsxISQiIiLSchwyJiIiIs3ESSWiYYWQiIiISMuxQkhERESaiZNKRMMKIREREZGWY0JIREREpOU4ZExERESaSZan7gjKDVYIiYiIiLQcK4RERESkmTipRDSsEBIRERFpOVYIiYiISDNxYWrRlLpCmJmZKUYcRERERKQmSiWEMpkMS5cuRZUqVWBqaoqwsDAAwIIFC7B9+3ZRAyQiIiIi1VIqIfzuu++wa9curFy5EgYGBvL2hg0bYtu2baIFR0RERFQkQaa+rZxRKiHcs2cPtmzZAjc3N+jq6srbmzRpgsDAQNGCIyIiIiLVU2pSybNnz+Do6FigXSaTIScnp9RBEREREb0TJ5WIRqkKYYMGDXD58uUC7UeOHEGzZs1KHRQRERERlR2lKoQLFy7EiBEj8OzZM8hkMvz6668ICgrCnj178Mcff4gdIxERERGpkFIVwj59+uDEiRM4d+4cTExMsHDhQjx8+BAnTpxAly5dxI6RiIiIqABByFPbVt4ovTB1u3btcPbsWTFjISIiIiI14JNKiIiISDOVw+Vf1EWphLBChQqQSCQF2iUSCQwNDeHo6IiRI0fC3d291AESERERkWopPalk2bJl6NGjB5ydnQEAvr6+8Pb2xqRJkxAeHo4JEyYgNzcXY8eOFTVgIiIiIgBcdkZESiWEV65cwXfffYfx48crtP/00084c+YMjh49isaNG2P9+vVMCImIiIjec0rNMj59+jRcXV0LtHfu3BmnT58GAPTs2VP+jGMiIiIien8plRBaWVnhxIkTBdpPnDgBKysrAEBaWhrMzMxKFx0RERFRUfgsY9EoNWS8YMECTJgwARcvXpTfQ3jz5k2cOnUKXl5eAICzZ8+iQ4cO4kVKRERERCqhVEI4duxYNGjQABs3bsSvv/4KAKhbty4uXbqE1q1bAwBmzJghXpRERERE/yUrfwtEq4vS6xC2adMGbdq0ETMWIiIiIlKDUi9MnZmZiezsbIU2c3Pz0p6WiIiIiMqI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UgnhvXv30KxZMwDA/fv3FV57c4IJEREREb3/lEoIL168KHYcRERERKQmSiWERERERGrHSSWi4TRhIiIiIi3HCiERERFpJk4qEQ0rhERERERajgkhERERkZbjkDERERFpJk4qEQ0rhERERERajhVCIiIi0kycVCIaVgiJiIiItBwrhERERKSZeA+haFghJCIiItJyTAiJiIiItByHjImIiEgzcchYNKwQEhEREWk5VgiJiIhIMwmCuiMoN1ghJCIiItJyTAiJiIiItByHjImIiEgzcVKJaFghJCIiItJyrBASERGRZmKFUDSsEBIRERFpOVYIiYiISDMJrBCKhRVCIiIiIi3HhJCIiIhIy3HImIiIiDQTJ5WIhhVCIiIiIi3HCiERERFpJj7LWDSsEBIRERFpOSaERERERFqOQ8ZERESkmTipRDSsEBIRERFpufemQmhUuZ26Q6BXMp5fVncI9Eruqa3qDoFeGbXgobpDoDc8nNVC3SHQ+4AVQtGwQkhERESk5d6bCiERERFRifBZxqJhhZCIiIhIyzEhJCIiItJyHDImIiIijSTI+KQSsbBCSERERKTlWCEkIiIizcRlZ0TDCiERERGRlmNCSERERKTlOGRMREREmonrEIqGFUIiIiIiLccKIREREWkmLjsjGlYIiYiIiLQcK4RERESkmbjsjGhYISQiIiLSckwIiYiIiLQch4yJiIhIM3HIWDSsEBIRERFpOVYIiYiISDMJXHZGLKwQEhEREWk5JoREREREWo5DxkRERKSZOKlENKwQEhEREWk5VgiJiIhIM/FZxqJhhZCIiIhIy7FCSERERJpJ4D2EYmGFkIiIiEjLMSEkIiIi0nJMCImIiEgzyQT1bSW0adMmODg4wNDQEK1atYKvr+9b+yclJWHSpEmoVKkSpFIp6tSpg1OnTin7Sb0T7yEkIiIiUqFDhw7Bw8MDXl5eaNWqFdauXYtu3bohKCgItra2BfpnZ2ejS5cusLW1xZEjR1ClShU8fvwYlpaWKouRCSERERFpJEFDFqZes2YNxo4dC3d3dwCAl5cXTp48iR07dmDOnDkF+u/YsQOJiYm4du0a9PX1AQAODg4qjZFDxkREREQqkp2dDX9/f7i6usrbdHR04OrqiuvXrxd6zPHjx+Hi4oJJkybBzs4ODRs2xPLly5GXl6eyOFkhJCIiIiqhrKws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h0Cv6PUcq+4Q6JVmCxaqOwR6Q8DaZHWHQK+0nq3uCEgM701CSERERFQSnFQiHt5DSERERKTlmBASERERaTkOGRMREZFGEmScVCIWVgiJiIiItBwrhERERKSROKlEPKwQEhEREWk5VgiJiIhIIwlcmFo0rBASERERaTkmhERERERajkPGREREpJE4qUQ8rBASERERaTlWCImIiEgjcWFq8bBCSERERKTlmBASERERaTkOGRMREZFGEgR1R1B+sEJIREREpOVYISQiIiKNxEkl4mGFkIiIiEjLsUJIREREGokVQvGwQkhERESk5ZgQEhEREWk5DhkTERGRRuKyM+IpcYUwNzcXe/bsQUxMjCriISIiIqIyVuIKoZ6eHsaPH4+HDx+qIh4iIiKiYuGkEvEodQ+hs7MzAgICRA6FiIiIiNRBqXsIJ06cCA8PDzx58gQtWrSAiYmJwuuNGzcWJTgiIiIiUj2lEsIhQ4YAAKZOnSpvk0gkEAQBEokEeXl54kRHREREVARB4JCxWJRKCMPDw8WOg4iIiIjURKmEsEaNGmLHQURERFQigkzdEZQfSi9MvXfvXrRp0waVK1fG48ePAQBr167F77//LlpwRERERKR6SiWEmzdvhoeHB3r27ImkpCT5PYOWlpZYu3atmPERERERFUomSNS2lTdKJYQbNmzA1q1bMW/ePOjq6srbnZyccO/ePdGCIyIiIiLVUyohDA8PR7NmzQq0S6VSpKWllTooIiIiIio7SiWENWvWLHRham9vb9SvX7+0MRERERG9kyBI1LaVN0rNMvbw8MCkSZOQmZkJQRDg6+uLAwcOwNPTE9u2bRM7RiIiIiJSIaUSwjFjxsDIyAjz589Heno6hg0bhsqVK2PdunXyRauJiIiIVInPMhaPUgkhALi5ucHNzQ3p6elITU2Fra2tmHERERERURlR6h7CHTt2yJ9WYmxszGSQiIiISIMplRB6enrC0dER1atXxxdffIFt27YhJCRE7NiIiIiIiiQI6tvKG6USwkePHiEyMhKenp4wNjbGqlWrULduXVStWhWff/652DESERERkQop/ei6KlWqwM3NDT/88APWrVuHL774AjExMTh48KCY8REREREVSpBJ1LaVN0pNKjlz5gx8fHzg4+OD27dvo379+ujQoQOOHDmC9u3bix0jEREREamQUglh9+7dYWNj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hJCIiIhIy3HImIiIiDQSn1QiHlYIiYiIiLQcK4RERESkkbjsjHhYISQiIiLScu9NhdA7JUjdIdArD2e1UHcI9ErA2mR1h0CvjGoxU90h0Bt2+K9SdwhE5cp7kxASERERlQSfZSweDhkTERERaTlWCImIiEgjcdkZ8bBCSERERKTlWCEkIiIijcRnGYuHFUIiIiIiLceEkIiIiEjLcciYiIiINBKfVCIeVgiJiIiItBwrhERERKSRuDC1eFghJCIiItJyTAiJiIiItByHjImIiEgj8Ukl4mGFkIiIiEjLsUJIREREGolPKhEPK4REREREWo4VQiIiItJIvIdQPKwQEhEREWk5JoREREREWo5DxkRERKSR+KQS8bBCSERERKTlWCEkIiIijSTjsjOiYYWQiIiISMsxISQiIiLSchwyJiIiIo3EAWPxsEJIREREpOVYISQiIiKNxCeViIcVQiIiIiItxwohERERaSRWCMXDCiERERGRlmNCSERERKTlOGRMREREGkngk0pEwwohERERkZZjhZCIiIg0EieViIcVQiIiIiItx4SQiIiISMtxyJiIiIg0ksAhY9GwQkhERESk5VghJCIiIo3EZWfEwwohERERkZZjhZCIiIg0EpedEQ8rhERERERajgkhERERkZbjkDERERFpJE4qEY8oFcK8vDwEBATgxYsXYpyOiIiIiMqQUgnhtGnTsH37dgD5yWCHDh3QvHlzVKtWDT4+PmLGR0RERFQoGQS1beWNUgnhkSNH0KRJEwDAiRMnEB4ejsDAQEyfPh3z5s0TNUAiIiIiUi2lEsL4+HjY29sDAE6dOoVBgwahTp06GDVqFO7duydqgERERESkWkolhHZ2dnjw4AHy8vLg7e2NLl26AADS09Ohq6sraoBEREREhRHU+F95o1RC6O7ujs8++wwNGzaERCKBq6srAODGjRuoV6+eqAESERERaYvExES4ubnB3NwclpaWGD16NFJTU4t1rCAI6NGjByQSCY4dO1ai91Vq2ZnFixejYcOGePLkCQYNGgSpVAoA0NXVxZw5c5Q5JREREVGJyMrhsjNubm6IiorC2bNnkZOTA3d3d4wbNw779+9/57Fr166FRCJR6n2VSgj37NmDwYMHyxPBfw0dOhQHDx5UKhAiIiIibfbw4UN4e3vj5s2bcHJyAgBs2LABPXv2xKpVq1C5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nj17IikpCXl5+UM7lpaWWLt2rZjxERERERWKk0rEo1RCuGHDBmzduhXz5s2Drq6uvN3JyQn37t17y5FERERE9L5RalJJeHg4mjVrVqBdKpUiLY3P5CUiIiLVE4TCl3OjklOqQlizZk0EBAQUaPf29kb9+vVLGxMRERERlSGlKoQeHh6YNGkSMjMzIQgCfH19ceDAAXh6emLbtm1ix0hEREREKqRUQjhmzBgYGRlh/vz5SE9Px7Bhw1ClShWsW7cOQ4YMETtGIiIiogJk5XByh7oolRBmZGSgX79+cHNzQ3p6Ou7fv4+rV6+iatWqYsdHRERERCqm1D2Effr0wZ49ewAA2dnZ+PTTT7FmzRr07dsXmzdvFjVAIiIiosIIgqC2rbxRKiG8desW2rVrBwA4cuQI7Ozs8PjxY+zZswfr168XNUAiIiIiUi2lEsL09HSYmZkBAM6cOYP+/ftDR0cHH330kfypJURERESkGZRKCB0dHXHs2DE8efIEp0+fRteuXQEAsbGxMDc3f8fRRERERKUng6C2rbxRKiFcuHAhZs6cCQcHB7Rq1QouLi4A8quFhS1YTURERETvL6VmGQ8cOBBt27ZFVFQUmjRpIm/v3Lkz+vXrJ1pwREREREUpj5M71EWphBAA7O3tYW9vr9Dm7Oxc6oCIiIiIqGwpnRASERERqZOMFULRKHUPIRERERGVH0wIiYiIiLQch4yJiIhIIwnlcPkXdWGFkIiIiEjLsUJIREREGonLzoiHFUIiIiIiLceEkIiIiEjLcciYiIiINFJ5fKawurBCSERERKTlWCEkIiIijcRJJeJhhZCIiIhIy7FCSERERBqJzzIWDyuERERERFqOCSERERGRluOQMREREWkkTioRDyuERERERFqOFUIiIiLSSFyYWjysEBIRERFpOSaERERERFqOQ8ZERESkkTipRDysEBIRERFpOVYIiYiISCPxSSXiYYWQiIiISMuxQkhEREQaSeCyM6JhhZCIiIhIyzEhJCIiItJyHDImIiIijcRJJeJhhZCIiIhIy7FCSERERBqJC1OLhxVCIiIiIi3HhJCIiIhIy3HImIiIiDQS1yEUDyuERERERFqOFUIiIiLSSJxUIh5WCImIiIi0HCuEREREpJFYIRQPK4REREREWo4JIREREZGW45AxERERaSQOGIuHFUIiIiIiLScReEem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",
      "text/plain": [
       "<Figure size 800x800 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "sns.heatmap(df[[\"mileage\", \"engine\", \"max_power\", \"torque\", \"seats\"]].corr(), annot=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92d57b3c",
   "metadata": {},
   "source": [
    "### 特征工程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "725e32b7",
   "metadata": {},
   "source": [
    "#### 分类字段one-hot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d116a101",
   "metadata": {},
   "outputs": [],
   "source": [
    "cat_columns = [\"fuel\", \"seller_type\", \"transmission\", \"owner\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "b2b90cd0",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import OneHotEncoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c3d51c18",
   "metadata": {},
   "outputs": [],
   "source": [
    "oneHotEncoder = OneHotEncoder(drop='first')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "9117e213",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0., ..., 0., 0., 0.],\n",
       "       [1., 0., 0., ..., 1., 0., 0.],\n",
       "       [0., 0., 1., ..., 0., 0., 1.],\n",
       "       ...,\n",
       "       [1., 0., 0., ..., 0., 0., 0.],\n",
       "       [1., 0., 0., ..., 0., 0., 0.],\n",
       "       [1., 0., 0., ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cat_features = oneHotEncoder.fit_transform(df[cat_columns]).toarray()\n",
    "cat_features"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e269936",
   "metadata": {},
   "source": [
    "#### 数值字段-标准化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "d86ef9d0",
   "metadata": {},
   "outputs": [],
   "source": [
    "num_columns = [\"mileage\", \"engine\", \"max_power\", \"torque\", \"seats\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "8b0e4aa3",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "d0e9b1e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "standardScaler = StandardScaler()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "e6a43d7b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.98615741, -0.41818825, -0.49202393, -1.13380819, -0.4341278 ],\n",
       "       [ 0.42619816,  0.07798015,  0.33382687, -0.60392401, -0.4341278 ],\n",
       "       [-0.42612921,  0.07599548, -0.38012003, -0.39197033, -0.4341278 ],\n",
       "       ...,\n",
       "       [-0.02969788, -0.41818825, -0.49482153, -1.13380819, -0.4341278 ],\n",
       "       [ 1.02827824, -0.12445656, -0.60392784, -0.07403982, -0.4341278 ],\n",
       "       [ 1.02827824, -0.12445656, -0.60392784, -0.07403982, -0.4341278 ]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_features = standardScaler.fit_transform(df[num_columns])\n",
    "num_features"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "abc41ff0",
   "metadata": {},
   "source": [
    "#### 构建X和Y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "d7fcca6b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.        ,  0.        ,  0.        , ..., -0.49202393,\n",
       "        -1.13380819, -0.4341278 ],\n",
       "       [ 1.        ,  0.        ,  0.        , ...,  0.33382687,\n",
       "        -0.60392401, -0.4341278 ],\n",
       "       [ 0.        ,  0.        ,  1.        , ..., -0.38012003,\n",
       "        -0.39197033, -0.4341278 ],\n",
       "       ...,\n",
       "       [ 1.        ,  0.        ,  0.        , ..., -0.49482153,\n",
       "        -1.13380819, -0.4341278 ],\n",
       "       [ 1.        ,  0.        ,  0.        , ..., -0.60392784,\n",
       "        -0.07403982, -0.4341278 ],\n",
       "       [ 1.        ,  0.        ,  0.        , ..., -0.60392784,\n",
       "        -0.07403982, -0.4341278 ]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.hstack([cat_features, num_features])\n",
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "95b07de4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([450000, 370000, 158000, ..., 382000, 290000, 290000])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = df[\"selling_price\"].to_numpy()\n",
    "y"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6296bf6b",
   "metadata": {},
   "source": [
    "### 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf0a3262",
   "metadata": {},
   "source": [
    "#### 数据集划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "639c9f7b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "5f729f45",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "8f6d9dc5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((6324, 15), (1582, 15), (6324,), (1582,))"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape, X_test.shape, y_train.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b24937db",
   "metadata": {},
   "source": [
    "#### 随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "5fd19f46",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.metrics import accuracy_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "944bd517",
   "metadata": {},
   "outputs": [],
   "source": [
    "random_model = RandomForestRegressor(n_estimators=300, random_state=42, n_jobs=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "022c81fd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestRegressor(n_estimators=300, n_jobs=-1, random_state=42)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestRegressor</label><div class=\"sk-toggleable__content\"><pre>RandomForestRegressor(n_estimators=300, n_jobs=-1, random_state=42)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestRegressor(n_estimators=300, n_jobs=-1, random_state=42)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "fae64ad8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([501435.72273345,  69723.27391447,  72551.19085396, ...,\n",
       "       247371.31951382, 311278.37842713,  98402.77777778])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = random_model.predict(X_test)\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "0c4b836e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9808868199317222"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_model.score(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "428931f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9500931113394425"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random_model.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e7f2f496",
   "metadata": {},
   "source": [
    "### 训练线性回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "e8091ecc",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "437ce49e",
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_model = LinearRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "91b46645",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {color: black;background-color: white;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LinearRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LinearRegression</label><div class=\"sk-toggleable__content\"><pre>LinearRegression()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "6c287960",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6669532344963451"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_model.score(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "38e00b95",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7002540060386012"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_model.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ddbdd6c",
   "metadata": {},
   "source": [
    "### 存储模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "fb5fb058",
   "metadata": {},
   "outputs": [],
   "source": [
    "model_dir = \"./flask-carprice/models\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "4f2e9c86",
   "metadata": {},
   "outputs": [],
   "source": [
    "import joblib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "3088763a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./flask-carprice/models/random_model.joblib']"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(random_model, f\"{model_dir}/random_model.joblib\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "ca86fb48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./flask-carprice/models/oneHotEncoder.joblib']"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(oneHotEncoder, f\"{model_dir}/oneHotEncoder.joblib\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "5547fe2c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['./flask-carprice/models/standardScaler.joblib']"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "joblib.dump(standardScaler, f\"{model_dir}/standardScaler.joblib\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "781ba266",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'{\"year\":{\"6068\":2020},\"selling_price\":{\"6068\":578000},\"km_driven\":{\"6068\":5000},\"fuel\":{\"6068\":\"Petrol\"},\"seller_type\":{\"6068\":\"Individual\"},\"transmission\":{\"6068\":\"Manual\"},\"owner\":{\"6068\":\"First Owner\"},\"mileage\":{\"6068\":21.21},\"engine\":{\"6068\":1197.0},\"max_power\":{\"6068\":81.8},\"torque\":{\"6068\":4200.0},\"seats\":{\"6068\":5.0}}'"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sample(1).to_json()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "0171e588",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>year</th>\n",
       "      <th>selling_price</th>\n",
       "      <th>km_driven</th>\n",
       "      <th>fuel</th>\n",
       "      <th>seller_type</th>\n",
       "      <th>transmission</th>\n",
       "      <th>owner</th>\n",
       "      <th>mileage</th>\n",
       "      <th>engine</th>\n",
       "      <th>max_power</th>\n",
       "      <th>torque</th>\n",
       "      <th>seats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2014</td>\n",
       "      <td>450000</td>\n",
       "      <td>145500</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.40</td>\n",
       "      <td>1248.0</td>\n",
       "      <td>74.00</td>\n",
       "      <td>2000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2014</td>\n",
       "      <td>370000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Second Owner</td>\n",
       "      <td>21.14</td>\n",
       "      <td>1498.0</td>\n",
       "      <td>103.52</td>\n",
       "      <td>2500.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2006</td>\n",
       "      <td>158000</td>\n",
       "      <td>140000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Third Owner</td>\n",
       "      <td>17.70</td>\n",
       "      <td>1497.0</td>\n",
       "      <td>78.00</td>\n",
       "      <td>2700.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2010</td>\n",
       "      <td>225000</td>\n",
       "      <td>127000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.00</td>\n",
       "      <td>1396.0</td>\n",
       "      <td>90.00</td>\n",
       "      <td>2750.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2007</td>\n",
       "      <td>130000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>16.10</td>\n",
       "      <td>1298.0</td>\n",
       "      <td>88.20</td>\n",
       "      <td>4500.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8123</th>\n",
       "      <td>2013</td>\n",
       "      <td>320000</td>\n",
       "      <td>110000</td>\n",
       "      <td>Petrol</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>18.50</td>\n",
       "      <td>1197.0</td>\n",
       "      <td>82.85</td>\n",
       "      <td>4000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8124</th>\n",
       "      <td>2007</td>\n",
       "      <td>135000</td>\n",
       "      <td>119000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>Fourth &amp; Above Owner</td>\n",
       "      <td>16.80</td>\n",
       "      <td>1493.0</td>\n",
       "      <td>110.00</td>\n",
       "      <td>2750.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8125</th>\n",
       "      <td>2009</td>\n",
       "      <td>382000</td>\n",
       "      <td>120000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>19.30</td>\n",
       "      <td>1248.0</td>\n",
       "      <td>73.90</td>\n",
       "      <td>2000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8126</th>\n",
       "      <td>2013</td>\n",
       "      <td>290000</td>\n",
       "      <td>25000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.57</td>\n",
       "      <td>1396.0</td>\n",
       "      <td>70.00</td>\n",
       "      <td>3000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8127</th>\n",
       "      <td>2013</td>\n",
       "      <td>290000</td>\n",
       "      <td>25000</td>\n",
       "      <td>Diesel</td>\n",
       "      <td>Individual</td>\n",
       "      <td>Manual</td>\n",
       "      <td>First Owner</td>\n",
       "      <td>23.57</td>\n",
       "      <td>1396.0</td>\n",
       "      <td>70.00</td>\n",
       "      <td>3000.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>7906 rows × 12 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      year  selling_price  km_driven    fuel seller_type transmission   \n",
       "0     2014         450000     145500  Diesel  Individual       Manual  \\\n",
       "1     2014         370000     120000  Diesel  Individual       Manual   \n",
       "2     2006         158000     140000  Petrol  Individual       Manual   \n",
       "3     2010         225000     127000  Diesel  Individual       Manual   \n",
       "4     2007         130000     120000  Petrol  Individual       Manual   \n",
       "...    ...            ...        ...     ...         ...          ...   \n",
       "8123  2013         320000     110000  Petrol  Individual       Manual   \n",
       "8124  2007         135000     119000  Diesel  Individual       Manual   \n",
       "8125  2009         382000     120000  Diesel  Individual       Manual   \n",
       "8126  2013         290000      25000  Diesel  Individual       Manual   \n",
       "8127  2013         290000      25000  Diesel  Individual       Manual   \n",
       "\n",
       "                     owner  mileage  engine  max_power  torque  seats  \n",
       "0              First Owner    23.40  1248.0      74.00  2000.0    5.0  \n",
       "1             Second Owner    21.14  1498.0     103.52  2500.0    5.0  \n",
       "2              Third Owner    17.70  1497.0      78.00  2700.0    5.0  \n",
       "3              First Owner    23.00  1396.0      90.00  2750.0    5.0  \n",
       "4              First Owner    16.10  1298.0      88.20  4500.0    5.0  \n",
       "...                    ...      ...     ...        ...     ...    ...  \n",
       "8123           First Owner    18.50  1197.0      82.85  4000.0    5.0  \n",
       "8124  Fourth & Above Owner    16.80  1493.0     110.00  2750.0    5.0  \n",
       "8125           First Owner    19.30  1248.0      73.90  2000.0    5.0  \n",
       "8126           First Owner    23.57  1396.0      70.00  3000.0    5.0  \n",
       "8127           First Owner    23.57  1396.0      70.00  3000.0    5.0  \n",
       "\n",
       "[7906 rows x 12 columns]"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "562d052d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
